package edu.ccut.saturn.component.impl.directory;

import java.util.Enumeration;

import org.osgi.framework.Bundle;

import edu.ccut.saturn.component.IBundleDataInfo;
import edu.ccut.saturn.component.IBundleInfo;
import edu.ccut.saturn.component.SaturnComponentException;
import edu.ccut.saturn.component.loader.SaturnDataLoader;

/**
 * 数据组件文件夹路径资源的实现类，数据组件文件夹位于bundle的根路径或模块文件夹内部，用于保存数据组件的配置文件。
 * 通过加载方法加载数据组件文件夹内部的数据组件。数据组件分两种类型：数据项和查询类型数据实体，对应的配置文件的文件后缀分别是“.saturndata”和“.sqldata”。
 * <p><code>SaturnBaseComponentDirectoryInfo</code>扩展了类<code>AbstractDirectoryInfo</code>。
 * 
 * @author 谷钰
 * @version 1.0 2008.8.29
 * 
 * @see AbstractDirectoryInfo
 * @see IBundleInfo
 * @see SaturnDataLoader
 * @see IBundleDataInfo
 * 
 */
public class SaturnDataDirectoryInfo extends AbstractDirectoryInfo {

	private static final String SATURN_DATA_FILE_POSTFIX = ".saturndata";

	private static final String SATURN_SQLDATA_FILE_POSTFIX = ".sqldata";

	public SaturnDataDirectoryInfo() {
		super(SATURN_DIRECTORY_TYPE_DATA);
	}

	/**
	 * 数据组件文件夹加载内部的数据组件配置文件的方法。
	 * 首先获得文件夹内部的所有的数据组件的访问路径；然后调用<code>SaturnDataLoader</code>获得数据组件的加载实例，
	 * 并保存到bundle对应的<code>IBundleInfo</code>实例中的<code>IBundleDataInfo</code>中。
	 * 
	 * @param bundle
	 *            加载的bundle对象实例
	 * @param bundleInfo
	 *            保存bundle的加载信息
	 */
	//TODO:是否还通过ComponentFactory调用加载过程
	@SuppressWarnings("unchecked")
	public void load(Bundle bundle, IBundleInfo bundleInfo) {
		Enumeration<String> dataFiles = bundle.getEntryPaths(super
				.getDirectoryPath());

		while (dataFiles.hasMoreElements()) {
			String dataFile = dataFiles.nextElement();
			
			try {
				
				if (dataFile != null) {
					
					if (dataFile.endsWith(SATURN_DATA_FILE_POSTFIX)
							|| dataFile.endsWith(SATURN_SQLDATA_FILE_POSTFIX)) {

						bundleInfo.getBundleDataInfo().addDataInfo(
								SaturnDataLoader.loadDataInfo(bundle, dataFile));
					}
				}
			
			} catch (SaturnComponentException e) {
				logger.error("load dataDirectory failed! the file name is \""
						+ dataFile + "\" in bundle ["
						+ bundle.getSymbolicName() + "]", e);
			}
		}
	}
}
